/*
玩家基础模块：
必须和扩展结构配合使用
扩展结构必须函数：
OnGetName()string 获取名称 注意这个必须要有
OnInit()     初始化
OnDestroy() 摧毁的回调
OnUpdate()  定时回调 -- 循环回调 -- 定时一次回调
*/
package tugou

// import (
// 	"encoding/json"
// 	"errors"

// 	//	"strings"

// 	//	"sync"
// 	"time"
// 	"tugou/logs"
// 	"tugou/utils"
// 	"tugou/web"
// 	"tugou/websocket"
// )

// type Player struct { //默认玩家模块
// 	isInit     bool    //是否初始化过来
// 	netType    int     //网络类型
// 	id         string  //模块ID
// 	name       string  //模块名称
// 	handler    handler //客户调用
// 	msg        chan messagePlayer
// 	quitModule chan gateInfo       //模块主动退出
// 	joinModule chan gateModuleJoin //加入模块
// 	closeUp    chan bool           //关闭
// 	disconnect chan bool           //断网
// 	ws         *websocket.Conn
// 	ticker     *time.Ticker //定时器
// 	modules    map[string]*moduleGateOrHome
// 	Manage     ManagePlayerI //模块内部使用
// 	extend     PlayerI       //自己
// }

// func (this *Player) OnSetId(id string) { //设置ID
// 	if this.isInit {
// 		return
// 	}
// 	this.id = id
// }

// //内部使用
// func (this *Player) run(extend PlayerI, c *web.Context, upgrader *websocket.Upgrader) {
// 	var err error
// 	if extend.OnInit(c) { //查看是否允许运行
// 		this.init(extend)
// 		this.ws, err = upgrader.Upgrade(c.ResponseWriter, c.Request, nil)
// 		if err != nil {
// 			logs.Error("http升级websocket失败", err)
// 		}
// 		go this.netRead()
// 		go this.locRead()
// 		this.SendC("欢迎使用土狗服务引擎", "GOLD", "HELLO")
// 		//this.Manage.JoinPlayer(this.id, this)
// 		ManagePlayer.addPlayer(this)
// 	}

// }
// func (this *Player) init(extend PlayerI) { //初始化

// 	if this.id == "" {
// 		this.id = utils.NewId()
// 	}
// 	this.closeUp = make(chan bool)
// 	this.disconnect = make(chan bool)
// 	this.msg = make(chan messagePlayer)
// 	this.joinModule = make(chan gateModuleJoin)
// 	this.quitModule = make(chan gateInfo)
// 	this.modules = make(map[string]*moduleGateOrHome)
// 	this.ticker = time.NewTicker(time.Second)
// 	this.ticker.Stop()
// 	this.extend = extend
// 	this.name = extend.OnGetName()
// 	this.bind(extend, Func_Net_Perfix, Func_Loc_PerFix)

// 	this.isInit = true

// }

// func (this *Player) netRead() { //网络读取
// 	defer func() {
// 		if err := recover(); err != nil {
// 			this.disconnect <- true
// 			logs.Critical("玩家网络读取协程发生恐慌", err)
// 		}
// 	}()
// 	for {
// 		msg := messageClient{}
// 		_, msgByte, err := this.ws.ReadMessage()
// 		if err != nil {
// 			logs.Error("websocket关闭类型错误", err)
// 			this.disconnect <- true
// 			break
// 		}
// 		err = json.Unmarshal(msgByte, &msg)
// 		if err != nil {
// 			logs.Error("玩家模块读取json错误:", err, "id:", this.id)
// 			msg.M = "World"
// 			msg.F = "Err"

// 		} else {
// 			logs.Debug("读取到网络数据")
// 			if msg.M == this.OnGetName() {
// 				msgPlayer := messagePlayer{}
// 				msgPlayer.data = msg.Data
// 				msgPlayer.funcName = msg.F
// 				this.msg <- msgPlayer
// 			} else {
// 				m, ok := this.modules[msg.M]
// 				if ok {
// 					err := m.sendByClient(msg.F, msg.Data)
// 					if err != nil {
// 						logs.Error(err)
// 					}
// 				} else {
// 					logs.Error("没有找到模块")
// 				}
// 			}

// 		}

// 	}

// }

// func (this *Player) locRead() { //通道读取
// 	defer func() {
// 		if err := recover(); err != nil {
// 			this.ws.Close()
// 			logs.Critical("玩家chan读取协程发生恐慌", err)
// 		}
// 	}()
// 	for {
// 		select {
// 		case msg := <-this.msg:
// 			logs.Debug("loc收到数据", this.name, msg)
// 			switch msg.route {
// 			case msg_Route_ServerToClient: //服务器到客户端
// 				this.SendC(msg.data, msg.moduleName, msg.funcName)
// 			case msg_Route_ServerToServer: //服务器到服务器
// 				if msg.moduleName == this.OnGetName() {
// 					err := this.handler.callAsync(Func_Loc_PerFix, msg.funcName, msg.module.N, msg.data)
// 					if err != nil {
// 						logs.Error("客户端到服务器", err)
// 					}
// 				} else {
// 					module, ok := this.modules[msg.moduleName]
// 					if ok {
// 						err := module.Send(msg.funcName, msg.data)
// 						if err != nil {
// 							logs.Error("客户端到服务器", err)
// 						}
// 					} else {
// 						logs.Error("客户端到服务器", msg.moduleName, "不存在")
// 					}
// 				}
// 			case msg_Route_ClientToServer: //客户端到服务器
// 				err := this.handler.callAsync(Func_Net_Perfix, msg.funcName, msg.module.N, msg.data)
// 				if err != nil {
// 					logs.Error("客户端到服务器", err)
// 				}
// 			default: //默认
// 				logs.Error("玩家路由没有找到Route方向")
// 			}
// 		case joinGate := <-this.joinModule: //加入模块
// 			m := &moduleGateOrHome{}
// 			ok := this.extend.OnModuleJoin(m, joinGate.request)
// 			if ok {
// 				if joinGate.reply != nil {
// 					joinGate.reply <- true //允许加入
// 					m.palyer = this
// 					m.gateModule = joinGate.gateModule
// 					m.state = Gate_state_home
// 					this.modules[joinGate.gateModule.gateInfo.N] = m

// 				}

// 			} else {
// 				if joinGate.reply != nil {
// 					joinGate.reply <- false //不允许加入
// 				}
// 			}
// 		case quitGate := <-this.quitModule: //退出模块
// 			_, ok := this.modules[quitGate.N]
// 			if ok {
// 				delete(this.modules, quitGate.N)
// 				this.OnModuleQuit(quitGate.N)
// 			}
// 		case <-this.ticker.C: //定时回调，默认关闭
// 			this.extend.OnUpdate()
// 		case <-this.disconnect: //断线
// 			//遍历发送消息
// 			for _, v := range this.modules {
// 				err := v.Quit()
// 				if err != nil {
// 					logs.Error(err)
// 				}
// 			}
// 			goto Over
// 		}
// 	}
// Over:
// 	this.ws.Close()
// 	this.Manage.QuitPlayer(this.id) //注销
// }

// func (this *Player) bind(extend PlayerI, netPerfix string, locPerfix string) { //绑定扩展
// 	this.handler.bind(extend, netPerfix, locPerfix)
// }

// //func (this *Player)GetN
// func (this *Player) setName(name string) { //内部调用设置名称
// 	this.name = name
// }
// func (this *Player) getGateInfo() gateInfo {
// 	info := gateInfo{}
// 	info.I = this.id
// 	info.N = this.name
// 	return info
// }
// func (this *Player) getGatePlayer() gatePlayer {
// 	gate := gatePlayer{}
// 	gate.gateInfo = this.getGateInfo()
// 	gate.msg = this.msg
// 	gate.join = this.joinModule
// 	gate.quit = this.quitModule
// 	return gate
// }

// func (this *Player) delModule(name string) error { //删除模块
// 	_, ok := this.modules[name]
// 	if ok {
// 		delete(this.modules, name)
// 		return nil
// 	}
// 	return errors.New("玩家删除模块不存在" + name)
// }
// func (this *Player) GetModule(name string) (ModuleHome, bool) { //检查是否存在
// 	module, ok := this.modules[name]
// 	return module, ok
// }

// //外部系统回调
// func (this *Player) SetId(id string) {
// 	this.id = id
// }
// func (this *Player) OnGetName() string {
// 	return this.name
// }
// func (this *Player) OnDisconnect() { //玩家掉线回调
// 	logs.Info("玩家掉线回调")
// }
// func (this *Player) OnModuleJoin(m ModuleHome, data interface{}) bool {
// 	return true
// }
// func (this *Player) OnModuleQuit(name string) { //模块退出
// 	logs.Info("玩家-退出模块成功-玩家模块没有替换")
// }
// func (this *Player) OnModuleDisconnect(name string) { //模块掉线了
// 	logs.Info("玩家-模块掉线了")
// }
// func (this *Player) OnInit(c *web.Context) bool { //初始化
// 	logs.Info("玩家-初始化")
// 	return true
// }
// func (this *Player) OnUpdate() { //定时回调
// 	logs.Info("玩家-更新")
// }
